﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NHibernate;
using NHibernate.Criterion;
using ReservasServices.Dominio;
using System.Collections;

namespace ClienteServices.Persistencia
{
    public class BaseDAO<Entidad, Id>
    {
        public Entidad Crear(Entidad entidad)
        {
            using (ISession sesion = NHibernateHelper.ObtenerSesion())
            {
                sesion.Save(entidad);
                sesion.Flush();
            }
            return entidad;
        }
        public Entidad Obtener(Id id)
        {
            using (ISession sesion = NHibernateHelper.ObtenerSesion())
            {
                return sesion.Get<Entidad>(id);
            }
        }

        public Reserva ObtenerReserva(int canchita, int cliente, int diaHora)
        {
            using (ISession sesion = NHibernateHelper.ObtenerSesion())
            {

                return (Reserva)sesion.CreateCriteria<Reserva>()
                    .Add(Restrictions.Eq("canchita", canchita))
                    .Add(Restrictions.Eq("cliente", cliente))
                    .Add(Restrictions.Eq("diaHora", diaHora))
                           .SetMaxResults(1).UniqueResult();
            }
        }

        public Reserva ObtenerReservaDisponible(int canchita, int cliente, int diaHora)
        {
            using (ISession sesion = NHibernateHelper.ObtenerSesion())
            {
                ArrayList arr=new ArrayList();
                arr.Add("0");
                arr.Add("1");

                return (Reserva)sesion.CreateCriteria<Reserva>()
                    .Add(Restrictions.Eq("canchita", canchita))
                    .Add(Restrictions.Eq("cliente", cliente))
                    .Add(Restrictions.Eq("diaHora", diaHora))
                    .Add(Restrictions.In("estado", arr))
                           .SetMaxResults(1).UniqueResult();
            }
        }

        public ICollection<Reserva> ListarTodosxConfirmar()
        {
            using (ISession sesion = NHibernateHelper.ObtenerSesion())
            {

                return sesion.CreateCriteria<Reserva>().Add(Restrictions.Eq("estado", "0")).List<Reserva>();
            }
        }



        public DiaHora ObtenerDiaHora(int dia, int hora)
        {
             using (ISession sesion = NHibernateHelper.ObtenerSesion())
            {
            DiaHora dias=(DiaHora)sesion.CreateCriteria<DiaHora>()
                       .Add(Restrictions.Eq("dia", dia))
                       .Add(Restrictions.Eq("hora", hora)).SetMaxResults(1).UniqueResult();
            return dias;
            }
        }


        public ArrayList ObtenerFiltro(int idCanchita, int idCliente)
        {
            

            using (ISession sesion = NHibernateHelper.ObtenerSesion())
            {
                return (ArrayList)sesion.CreateCriteria<Reserva>()
                        .Add(Restrictions.Eq("canchita", idCanchita))
                        .Add(Restrictions.Eq("cliente", idCliente)).List();
            }
        }

        public ArrayList ObtenerListado(int idCanchita)
        {
            using (ISession sesion = NHibernateHelper.ObtenerSesion())
            {
                return (ArrayList)sesion.CreateCriteria<Reserva>()
                        .Add(Restrictions.Eq("canchita", idCanchita)).List();
            }
        }


        public Entidad Modificar(Entidad entidad)
        {
            using (ISession sesion = NHibernateHelper.ObtenerSesion())
            {
                sesion.Update(entidad);
                sesion.Flush();
            }
            return entidad;
        }
        public void Eliminar(Entidad entidad)
        {
            using (ISession sesion = NHibernateHelper.ObtenerSesion())
            {
                sesion.Delete(entidad);
                sesion.Flush();
            }
        }
        public ICollection<Entidad> ListarTodos()
        {
            using (ISession sesion = NHibernateHelper.ObtenerSesion())
            {
                ICriteria busqueda = sesion.CreateCriteria(typeof(Entidad));
                return busqueda.List<Entidad>();
            }
        }
    }
}